var MY_VALIDATOR = (function() {
	/**
	 * type 1:数字个数 2:英文个数 3:汉字个数
	 */
	function getStrCnt(str, type) {
		if (str && str.length > 0) {
			var re=/\d/g;
			if (type == 2) {
				re = /[a-zA-Z]/g;
			} else if (type == 3) {
				re = /[\u4e00-\u9fa5]/g;
			}
			var match = str.match(re);
			return match != null ? match.length : 0;
		} else {
			return 0;
		}
	}
	/* 
	用途：检查输入的Email信箱格式是否正确 
	输入：strEmail：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function checkEmail(strEmail) {
		var reg = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
		return reg.test(strEmail);
	};
	
	/**
	 * 网址check
	 */
	function checkUrl(url) {
		var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
			+ "?(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?"
			+ "(([0-9]{1,3}.){3}[0-9]{1,3}" 
			+ "|"
			+ "([0-9a-zA-Z_!~*'()-]+.)*"
			+ "([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]."
			+ "[a-zA-Z]{2,6})"
			+ "(:[0-9]{1,4})?"
			+ "((/?)|"
			+ "(/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+/?)$";
		var re= new RegExp(strRegex);
		if (re.test(url)){
	      return (true);
		} else {
	      return (false);
		}
	}
	  
	/*
	用途：校验ip地址的格式 
	输入：strIP：ip地址 
	返回：如果通过验证返回true,否则返回false； 
	*/
	function isIP(strIP) 
	{
	    if (isNull(strIP)) {
	        return false;
	    }
	    var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //匹配IP地址的正则表达式 
	    if (re.test(strIP)) {
	        if ( RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) {
	            return true;
	        }
	    }
	    return false;
	};
	  
	/* 
	用途：检查输入手机号码是否正确 
	输入：strMobile：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function checkMobile( strMobile )
	{
	    var regu = /^[1][0-9]{10}$/;
	    var re = new RegExp(regu);
	    if (re.test(strMobile)) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入的电话号码格式是否正确 
	输入：strPhone：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function checkPhone( strPhone ) 
	{
	    var phoneRegWithArea = /^[0][1-9]{2,3}-[0-9]{5,10}$/;
	    var phoneRegNoArea = /^[1-9]{1}[0-9]{5,8}$/;
	    if ( strPhone.length > 9 ) {
	        if ( phoneRegWithArea.test(strPhone) ) {
	            return true;
	        }
	        else {
	            return false;
	        }
	    }
	    else {
	        if ( phoneRegNoArea.test( strPhone ) ) {
	            return true;
	        }
	        else {
	            return false;
	        }
	    }
	};
	  
	/* 
	用途：检查输入字符串是否为空 
	输入：str 
	返回：如果是空返回true,否则返回false 
	*/
	function isEmpty(obj){
	    if(typeof obj == "undefined" || obj == null || obj == ""){
	        return true;
	    }else{
	        return false;
	    }
	}
	
	/* 
	用途：检查输入字符串是否为空或者全部都是空格 
	输入：str 
	返回：如果全是空返回true,否则返回false 
	*/
	function isNull( str )
	{
	    if ( str == "" ) {
	        return true;
	    }
	    var regu = "^[ ]+$";
	    var re = new RegExp(regu);
	    return re.test(str);
	};
	  
	/* 
	用途：检查输入对象的值是否符合整数格式 
	输入：str 输入的字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isInteger( str )
	{
	    var regu = /^[-]{0,1}[0-9]{1,}$/;
	    return regu.test(str);
	};
	  
	/* 
	用途：检查输入字符串是否符合正整数格式 
	输入：s：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isNumber( s )
	{
	    var regu = "^[0-9]+$";
	    var re = new RegExp(regu);
	    if (s.search(re) != - 1) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入字符串是否是带小数的数字格式
	输入：str：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isDecimal( str )
	{
	    if (isNumber(str)) {
	        return true;
	    }
	    var re = /^[]{0,1}(\d+)[\.]+(\d+)$/;
	    if (re.test(str)) {
	        if (RegExp.$1 == 0 && RegExp.$2 == 0) {
	            return false;
	        }
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入对象的值是否符合端口号格式 
	输入：str 输入的字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isPort( str )
	{
	    return (isNumber(str) && str < 65536);
	};
	  
	/* 
	用途：包含正负，小数点后两位
	输入：s：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isMoney( s )
	{
//	    var regu = "^[0-9]+[\.][0-9]{0,3}$";
		  //金额 允许正负数
        var regu = /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/; 
	    var re = new RegExp(regu);
	    if (re.test(s)) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入字符串是否只由英文字母和数字和下划线组成 
	输入：s：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isNumberOr_Letter( s )
	{
	    //判断是否是数字或字母 
	    var regu = "^[0-9a-zA-Z\_]+$";
	    var re = new RegExp(regu);
	    if (re.test(s)) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入字符串是否只由英文字母和数字组成 
	输入：s：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isNumberOrLetter( s )
	{
	    //判断是否是数字或字母 
	    var regu = "^[0-9a-zA-Z]+$";
	    var re = new RegExp(regu);
	    if (re.test(s)) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：检查输入字符串是否只由汉字、字母、数字组成 
	输入：s：字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isChinaOrNumbOrLett( s )
	{
	    //判断是否是汉字、字母、数字组成 
	    var regu = "^[0-9a-zA-Z\u4e00-\u9fa5]+$";
	    var re = new RegExp(regu);
	    if (re.test(s)) {
	        return true;
	    }
	    else {
	        return false;
	    }
	};
	  
	/* 
	用途：判断是否是日期 
	输入：date：日期；fmt：日期格式 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isDate( date, fmt ) {
	    if (fmt == null) {
	        fmt = "yyyyMMdd";
	    }
	    var yIndex = fmt.indexOf("yyyy");
	    if (yIndex == -1) {
	        return false;
	    }
	    var year = date.substring(yIndex, yIndex + 4);
	    var mIndex = fmt.indexOf("MM");
	    if (mIndex == -1) {
	        return false;
	    }
	    var month = date.substring(mIndex, mIndex + 2);
	    
	    if (!isNumber(year) || year > "2100" || year < "1900") {
	        return false;
	    }
	    if (!isNumber(month) || month > "12" || month < "01") {
	        return false;
	    }
	    var dIndex = fmt.indexOf("dd");
	    if (dIndex > - 1) {
	    	var day = date.substring(dIndex, dIndex + 2);
	    	if (!isNumber(day) || day > getMaxDay(year, month) || day < "01") {
		        return false;
		    }
	    }
	    
	    return true;
	};

	/*
	用途：判断是否是日期
	输入：date：日期；fmt：日期格式
	返回：如果通过验证返回true,否则返回false
	*/
	function isYear(date) {
		var fmt = "yyyy";

		if (date.length != 4) {
			return false;
		}

		var year = date.substring(0, 4);

		if (!isNumber(year) || year > "2100" || year < "1900") {
			return false;
		}

		return true;
	};
	
	function getMaxDay(year, month) {
	    if (month == 4 || month == 6 || month == 9 || month == 11) {
	        return "30";
	    }
	    if (month == 2) {
	        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
	            return "29";
	        }
	        else {
	            return "28";
	        }
	    }
	    return "31";
	};
	  
	/* 
	用途：字符1是否以字符串2结束 
	输入：str1：字符串；str2：被包含的字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isLastMatch(str1, str2) 
	{
	    var index = str1.lastIndexOf(str2);
	    if (str1.length == index + str2.length) {
	        return true;
	    }
	    return false;
	};
	  
	/* 
	用途：字符1是否以字符串2开始 
	输入：str1：字符串；str2：被包含的字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isFirstMatch(str1, str2) 
	{
	    var index = str1.indexOf(str2);
	    if (index == 0) {
	        return true;
	    }
	    return false;
	};
	  
	/* 
	用途：字符1是包含字符串2 
	输入：str1：字符串；str2：被包含的字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function isMatch(str1, str2) 
	{
	    var index = str1.indexOf(str2);
	    if (index ==- 1) {
	        return false;
	    }
	    return true;
	};
	  
	/* 
	用途：检查输入的起止日期是否正确，规则为两个日期的格式正确，且结束如期>=起始日期 
	输入：startDate：起始日期，字符串; endDate：结束如期，字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function checkTwoDate( startDate, endDate ) 
	{
	    if ( !isDate(startDate) ) {
	        return "起始日期不正确!";
	    }
	    else if ( !isDate(endDate) ) {
	        return "终止日期不正确!";
	    }
	    else if ( startDate > endDate ) {
	        return "起始日期不能大于终止日期!";
	    }
	    return "";
	};
	  
	function checkDate( value ) 
	{
	    if (value == '') {
	        return true;
	    }
	    if (value.length != 8 || !isNumber(value)) {
	        return false;
	    }
	    var year = value.substring(0, 4);
	    if (year > "2100" || year < "1900") {
	        return false;
	    }
	    var month = value.substring(4, 6);
	    if (month > "12" || month < "01") {
	        return false;
	    }
	    var day = value.substring(6, 8);
	    if (day > getMaxDay(year, month) || day < "01") {
	        return false;
	    }
	    return true;
	};
	  
	/* 
	用途：检查输入的起止日期是否正确，规则为两个日期的格式正确或都为空且结束日期>=起始日期 
	输入：startDate：起始日期，字符串; endDate： 结束日期，字符串 
	返回：如果通过验证返回true,否则返回false 
	*/
	function checkPeriod( startDate, endDate ) 
	{
	    if ( !checkDate(startDate) ) {
	        alert("起始日期不正确!");
	        return false;
	    }
	    else if ( !checkDate(endDate) ) {
	        alert("终止日期不正确!");
	        return false;
	    }
	    else if ( startDate > endDate ) {
	        alert("起始日期不能大于终止日期!");
	        return false;
	    }
	    return true;
	};
	  
	
	/**
	 * 时刻（hh：mm）格式check
	 */
	function checkHm($input) {
		if ($input.length) {
			var hm = $input.val();
			if (hm.length) {
				if (hm.indexOf(":")) {
					hm = hm.replace(":", "");
				}
				if (hm.length == 3) {
					hm = "0" + hm;
				}
				if (hm.length != 4) {
					return false;
				} else {
					var h = hm.substr(0, 2);
					var m = hm.substr(-2);
					if (!isNumber(h) || !isNumber(m)) {
						return false;
					} else {
						if (Number(h) < 0 || Number(h) > 23) {
							return false;
						}
						if (Number(m) < 0 || Number(m) > 59) {
							return false;
						}
						
						$input.val(h + ":" + m)
					}
				}
			}
		}
		return true;
	}
	
	/**
	 * 是否是连续字符
	 * @param str
	 * @return
	 */
	function isContinueChar(str) {
		if (typeof str != "undefined") {
			if (str.length > 1) {
				var chars = str.split('');
				for (var i = 1; i < chars.length; i++) {
					if (Math.abs(chars[i].charCodeAt() - chars[i - 1].charCodeAt()) != 1) {
						return false;
					}
				}
			}
			return true;
		} else {
			return str;
		}
	}

	return {
		isEmpty: isEmpty,
		isInteger: isInteger,
		isNumber: isNumber,
		isDecimal: isDecimal,
		checkPhone: checkPhone,
		checkMobile: checkMobile,
		checkEmail: checkEmail,
		checkHm: checkHm,
		checkUrl: checkUrl,
		isDate: isDate,
		getStrCnt: getStrCnt,
		isContinueChar: isContinueChar,
		isMoney:isMoney,
		isYear: isYear,
	};
})();